/**
 @file app.h
 @brief Funcionalidad de capa aplicación y de gestión de comunicación entre nodos.
 @date   06/11/2012
 @version v.0.9
 @author Julian Ovalle
         julianovalle@ula.ve
*/

#ifndef APP_H_
#define APP_H_

#include "packet_output.h"
#include "app_layer_def.h"

//#define APP_LAYER_DEBUG

/*!
   @brief Inicializa la capa aplicación creando la cola de entrada para tramas de control y realiza el primer descubrimiento de nodos
   @return 0 en caso de exito. -1 en caso de error @see nodeDiscovery()
 */
int appLayerInit();

/*!
   @brief Finaliza la capa aplicación destruyendo la cola de entrada para tramas de control y eliminando la lista de nodos
   @return 0 en caso de exito. -1 en caso de error
 */
int appLayerExit();

/*!
   @brief Extrae la data de las tramas XBee y verifica la validez del nodo origen antes de entregarla al servicio de intercambio de mensajes
   @param mtype tipo de trama XBee API @see packet_def.h
   @param packet Apuntador a la trama recibida
 */
void appLayerInput(uint8_t mtype, void * packet);

/*!
   @brief Encuentra el nodo en la lista cuya direccion sea addr16 y/o addr64
   @param *list apuntador a la lista de nodos @see wpan_node_t
   @param addr16 dirección de 16 bits
   @param addr64 dirección de 64 bits
   @return Apuntador al nodo en caso de exito. NULL en caso de error
 */
wpan_node_t *findNode(wpan_node_t *list, uint16_t addr16, uint64_t addr64);

/*!
   @brief Encuentra el nodo en la lista cuyo identificador sea id
   @param *list apuntador a la lista de nodos @see wpan_node_t
   @param id identificador a encontrar
   @return Apuntador al nodo en caso de exito. NULL en caso de error
 */
wpan_node_t *findNodeById(char *id);

/*!
   @brief Obtiene el identificador de la cola de tramas tx_status
 */
int getTXSMsgq_id();

/*!
   @brief Descubrimiento de nodos. Encuentra todos los módulos operando en el mismo canal y el mismo PAN-ID y genera la lista de nodos
   @return Número de nodos encontrados (0, n)
 */
int nodeDiscovery();

/*!
   @brief Obtiene un Apuntador a la lista de nodos
 */
wpan_node_t * getNodeList();

/*!
   @brief Obtiene el número de nodos presentes en la lista
 */
int getNumNodes();

/*!
   @brief Actualiza el número de nodos presentes en la lista
 */
void setNumNodes(uint8_t val);

void printNodes();

/*!
   @brief Ejecuta un comando AT local
   @param *command caracteres que designan el comando
   @param val valor del parámetro a asignar. <0 para ignorar
   @param *strval cadena valor del parámetro a asignar. NULL para ignorar
   @param fid identificador de solicitud. 0 si no se desea respuesta
   @return 0 en caso de exito. -1 en caso de error
 */
int sendATCommand(char *command, long long val, char *strval, uint8_t fid);

int queryATCommand (char *command, uint8_t fid, uint8_t *buf);

/*!
   @brief Ejecuta un comando AT remoto
   @param *command caracteres que designan el comando
   @param addr16 dirección destino de 16 bits. Esta dirección se usará siempre que su valor sea distinto de 0xFFFE
   @param addr64 dirección destino de 64 bits
   @param val valor del parámetro a asignar. <0 para ignorar
   @param *strval cadena valor del parámetro a asignar. NULL para ignorar
   @param fid identificador de solicitud. 0 si no se desea respuesta
   @return 0 en caso de exito. -1 en caso de error
 */
int sendATRemoteCommand(char *command, uint16_t addr16, uint64_t addr64,
        long long val, char *strval, uint8_t fid);

#endif /* APP_H_ */
